/** 处理融合通讯业务的常用方法 */
import { VIDEO_ERROR_CODES } from "@/config/global.js";
import { getDeviceLiveVideo } from "@/utils/communicate/communicate";
import { getLiveVideoUrl } from "@/utils/communicate/ezviz.js";

/**
 * 处理数据列表中的视频流类型，不同类型不同处理
 * @param dataArray {Array<any>} 需要处理的数组
 * @param key {string} 数组中需要处理的url - 默认url
 * @return {Array<any>}
 * */
export const handleDataArrayVideo = async (dataArray, key = "url") => {
    let array = [];
    let temp = null;

    for(const index in dataArray) {
        temp = dataArray[index];
        //  判断是否是http开头的
        if(temp[key] && temp[key].indexOf("http") !== 0) {
			// 如果是海康设备...
			if(temp.vendorType === "monitoring_type_ysy") {
				const url = await getLiveVideoUrl(temp[key]);
				temp[key] = url || "";
				temp.type = "hls";
			}
			// 如果是融合通信设备...
			else {
				const { flv } = await getDeviceLiveVideo({caller: "8000", callee: temp[key], token: "88f7d44386a74f35e698d16646608fe0"});
				if(flv) {
				    temp[key] = flv;
				    temp.type = "flv";
				}
			}
        }
        array.push(temp);
    }
    return array;
}


/**
 * 判断视频流地址能否被访问 - 并做出对应操作
 * @param dataArray {Array<any>} 需要处理的数组
 * @param key {string} 数组中需要处理的url - 默认url
 * @return {Array<any>}
 * */
export const handleVideoArrayUrlError = async (dataArray, key = "url") => {
    let array = [];
    let res = null;

    for(const item of dataArray) {
        res = await fetch(item[key]).then(res => res.text());
        array.push({
            ...item,
            isReady: VIDEO_ERROR_CODES.findIndex(item1 => res.indexOf(item1) !== -1) === -1,
        });
    }

    return array;
}


/**
 * 判断视频流地址能否被访问 - 视频流类型、是否是错误视频
 * @param data {any} 需要处理的数据
 * @param key {string} 数组中需要处理的url - 默认url
 * @return {any}
 * */
export const handleVideoUrlErrorResult = async (data, key = "url") => {
    let isReady = false;
	
	// 判断是否存在
	if(!data[key]) {
	    return { ...data, isReady }
	}

    // 处理不同的流
    const videoArray = await handleDataArrayVideo([data], key);
    const videoItem = videoArray.length ? videoArray[0] : data;

    // 判断否存在能播放
    if (!videoItem) {
        videoItem = data
    }
	
	// 返回结果
	return { ...videoItem, isReady: videoItem ? videoItem.isReady : isReady }
}




